using UnityEngine;

//巡逻状态
namespace Enemy
{
    public class PatrolState : IState
    {
        private int patrolPosition;    // 当前巡逻点索引
        public PatrolState(FSM manager)
        {
            this.manager = manager;
            this.parameter = manager.parameter;
        }

        public override void OnEnter()
        {
            parameter.animator.Play("Walk");
            parameter.currentSpeed = parameter.moveSpeed;
            GeneratePatrolPoint();
            manager.RefreshTiming();
        }

        public override void OnUpdate()
        {
            // 如果被击中了，转换到受击状态
            if (parameter.isHurt)
            {
                manager.TransitionState(StateType.Hit);
            }

            // 如果有目标且目标在追逐范围内，则转换到反应状态
            if (parameter.target)
            {
                manager.TransitionState(StateType.React);
            }

            //如果已经接近当前巡逻点，则转换到空闲状态
            if (Vector2.Distance(manager.transform.position, parameter.patrolPoints[patrolPosition].position) < .1f)
            {
                manager.TransitionState(StateType.Idle);
            }

            manager.StartPath(parameter.patrolPoints[patrolPosition]);

            // 如果速度接近静止（每一段时间检测，防止敌人互相卡住）
            if (parameter.rb.velocity.magnitude < 0.1f && parameter.isPathRefresh)
            {
                manager.RefreshTiming();
                GeneratePatrolPoint();
            }
        }

        public override void OnFixedUpdate()
        {
            // 朝向当前巡逻点
            manager.FlipTo(parameter.patrolPoints[patrolPosition]);

            //移动到当前巡逻点
            manager.Move();
        }

        public override void OnExit()
        {
            GeneratePatrolPoint();
        }

        //随机选择下一个巡逻点
        public void GeneratePatrolPoint()
        {
            while (true)
            {
                // 选择一个随机的巡逻点索引
                int i = Random.Range(0, parameter.patrolPoints.Length);

                // 确保新选择的巡逻点与当前不同
                if (patrolPosition != i)
                // if (parameter.targetPointIndex != i)
                {
                    // parameter.targetPointIndex = i;
                    patrolPosition = i;
                    break; // 退出循环
                }
            }

        }
    }
}
